# coding:utf-8
import pandas as pd
from xtquant import xtdata, xtconstant, xttrader
from Config import *
from datetime import datetime, time, timedelta
"""
目前股票的筛选还是手动的！！！！待改进！！！！
"""
# 设置股票池，例：'000000.SZ', '600000.SH'
code_list = ['002201.SZ','600078.SH','603663.SH','603958.SH','603990.SH','605177.SH','605287.SH']

# 用于跟踪已下单股票的字典
ordered_stocks = {}
# 最大下单数量
max_order_count = 2
# 下单计数器
order_count = 0
# 个股下单金额
fund = 8900

def callback_func(data):
    global order_count  # 使用全局变量

    # 转换为DataFrame
    df = pd.DataFrame(data).T

    # 时间戳转换函数
    def timestamp_to_time(timestamp):
        return datetime.fromtimestamp(timestamp / 1000).strftime('%H:%M:%S')

    # 时间戳转换为小时分钟秒
    df['time'] = df['time'].apply(timestamp_to_time)

    # 精简数据
    df = df[['time', 'lastPrice', 'lastClose']]
    # print(df)

    # 创建一个时间范围的条件。竞价，上证票3秒一跳但不整齐，倒数第二笔有57，58,59。深证票9秒一跳，倒数第二笔都是57。
    time_condition = (df['time'] >= '09:24:57') & (df['time'] <= '09:25:06')

    """
    ！！！应该分成竞价前，竞价后两个条件。竞价最后一笔一般是往下砸的，那么要求范围-2%到-3%，也有可能砸到-3%到-4%的。！！！增加代码收割聚宽。！！！
    """
    # 创建一个价格条件，-3%到-4%开盘。
    price_condition = (df['lastPrice'] <= df['lastClose'] * 0.97) & (df['lastPrice'] >= df['lastClose'] * 0.96)

    # 将两个条件合并
    final_condition = time_condition & price_condition

    # 根据条件筛选 DataFrame
    filtered_df = df[final_condition]

    # 符合条件的股票执行下单
    for stock_code in filtered_df.index:
        # 检查是否已下单，如果已下单或达到最大下单数量则跳过
        if stock_code in ordered_stocks or order_count >= max_order_count:
            continue
        """
        计算买入价格，这里代码还是有问题！！！信息传输有时间差，竞价前满足条件下单，但是没来得及成交，实际是需要撤单，或者改价格重新下单的。只不过这个策略是要求低开，挂一个上限不会出大错。
        
        另外，其实可以连续下单，25分前也下，25分后也下。然后及时查询是否成交，如果25分前的成交了，则撤单25分后的。
        """
        # 如果是9:25:00之前，则按前收盘价*0.97买入
        if filtered_df.loc[stock_code, 'time'] < '09:25:00':
            adjusted_price = round(filtered_df.loc[stock_code, 'lastClose'] * 0.97, 2)
        # 否则，抢价格笼子上限买入
        else:
            adjusted_price = round(filtered_df.loc[stock_code, 'lastPrice'] * 1.02, 2)
        # 计算股数
        stock_quantity = fund / adjusted_price  # 符合条件的X000配置
        stock_quantity -= stock_quantity % 100  # 取整百
        stock_quantity = int(stock_quantity)  # 将结果转换为整数

        # 获取时间
        time = filtered_df.loc[stock_code, 'time']
        # 下单
        fix_result_order_id = xt_trader.order_stock(account_putong, stock_code, xtconstant.STOCK_BUY, stock_quantity,
                                                    xtconstant.FIX_PRICE, adjusted_price, '低位首板低开', '买入')
        print(f"时间：{time}，已下单股票：{stock_code}，订单号：{fix_result_order_id}")

        # 将已下单股票加入字典
        ordered_stocks[stock_code] = True
        # 更新下单计数器
        order_count += 1
    """
    撤单代码需要增加！！！！！竞价前下的-3%，但是-2%开盘，需要撤单。或者时间差卡位，导致-3%下单，但是-5%没有成交。需要赶紧撤单！！！
    
    当前这一步需要手动操作，别忘了撤单！！！！！！！！！
    """



xtdata.subscribe_whole_quote(code_list, callback=callback_func)
xtdata.run()
